#include <iostream>

using namespace std;

typedef long long ll;
const int N = 100010;
int n;
int q[N], tmp[N];

//分治思想
//1、左半边内部的逆序对数量：merge_sort(l, mid)
//2、右半边内部的逆序对数量：merge_sort(mid + 1, r)
//3、分别处于左右区域的逆序对：左区域i点的值大于右区域j点时，可以判断res = mid -i + 1;

//注意：此时  q[i]前面的数<q[j]  同时  q[i]后面的数>q[j]
//因为此时前面和后面的数已经完成递归，因此严格保证顺序
ll MergeSort(int q[], int l, int r){
    if(l >= r)  return 0;

    int mid = (l + r) >> 1;

    ll res = MergeSort(q, l, mid) + MergeSort(q, mid + 1, r);

    //归并过程，当出现逆序对时，记录res（res = mid -i + 1;）
    int k = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else {
            res += mid - i + 1;
            tmp[k ++ ] = q[j ++ ];
        }           
    

    while(i <= mid)     tmp[k ++ ] = q[i ++ ];
    while(j <= r)       tmp[k ++ ] = q[j ++ ];

    //保证递归出来的数列已经记录了逆序对顺序，
    //因此更新后，防止逆序对重复记录
    for(i = l, j = 0; i <= r; i ++, j ++)   q[i] = tmp[j];

    return res;    
}

int main(){
    scanf("%d", &n);

    for(int i = 0; i < n; i++){
        scanf("%d", &q[i]);
    }

    cout << MergeSort(q, 0, n - 1) << endl;

    return 0;
}